#pragma once
#include <functional>
#include <iostream>

using TaskFunc = std::function<void()>;
using ReleaseFunc = std::function<void()>;

class TimerTask
{
public:
    TimerTask(uint64_t id,uint32_t delay,const TaskFunc & cb):
    _id(id),_timeout(delay),_task_cb(cb),_canceled(false){}
    ~TimerTask()
    {
        if(!_canceled) _task_cb();
        _release();
    }

    //取消定时任务
    void Cancel()
    {
        _canceled = true;
    }

    //设置对时间轮的操作
    void SetRelease(const ReleaseFunc & cb)
    {
        _release = cb;
    }

    //获取任务超时时间
    uint32_t DelayTime()
    {
        return _timeout;
    }
private:
    uint64_t _id;//定时器任务对象id
    uint32_t _timeout; //定时任务超时时间
    bool _canceled;//false表示没有取消定时任务,true表示取消了定时任务
    TaskFunc _task_cb;//定时器对象要执行的定时任务
    ReleaseFunc _release;//用于删除时间轮中保存的定时器对象信息
};